﻿using System.Collections.Generic;
using System.ServiceModel;
using StockholmsStad.Runtime.Serialization.DataContract;
using StockholmsStad.Runtime.Serialization.DataContract.Enums;
using StockholmsStad.Utilities.Exceptions;

namespace StockholmsStad.ServiceModel.Interfaces
{
    /// <summary>
    /// 
    /// </summary>
    [ServiceContract]
    public interface ITicketService
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="partOfName"></param>
        /// <param name="partOfBirthday"></param>
        /// <param name="ticketStatus"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        IList<CouplesSummaryItem> GetTickets(User user, string partOfName, string partOfBirthday, TicketStatusType ticketStatus);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="ticketId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        Couple GetCouple(User user, int ticketId);

        ///<summary>
        /// Skickar ett mail till användaren med det befintliga lösenordet
        ///</summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        ///<param name="parvisUser">Epostadressen till den användare som lösenordet ska skickas till. </param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void SendForgottenPassword(User user, ParvisUser parvisUser);

        /// <summary>
        /// Operationskontrakt för addering av nya ärenden.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="couple">Paret (<see cref="Couple"/>) som ska läggas till ärendet.</param>
        /// <param name="ceremonyInformation">Ceremoniinformationen (<see cref="Ceremony"/>) som ska läggas till ärendet.</param>
        /// <returns>Ärendeid-numret.</returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddTicket(User user, Couple couple, Ceremony ceremonyInformation);

        /// <summary>
        /// Operationskontrakt för modifiering av befintlig förrättare
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ticketId">Ärendeid-numret</param>
        /// <param name="couple">Paret (<see cref="Couple"/>) som ska uppdateras.</param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateCouple(User user, int ticketId, Couple couple);

        /// <summary>
        /// Operationskontrakt för modifering av befintligt ärenden.
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ticketId">Ärendeid-numret</param>
        /// <param name="couple">Paret (<see cref="Couple"/>) som ska läggas till ärendet.</param>
        /// <param name="ceremonyInformation">Ceremoniinformationen (<see cref="Ceremony"/>) som ska läggas till ärendet.</param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateTicket(User user, int ticketId, Couple couple, Ceremony ceremonyInformation);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<History> GetNotices(User user);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <param name="historyId"></param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void InactivateNotice(User user, int historyId);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<DateRange> GetNonAvailableDates(User user);

        /// <summary>
        /// Hämtar icke fullbokade tidsblock som en lista med start-slut-datum (för kalender som 
        /// endast tar "utblockade" datum. 
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        List<DateRange> GetNonFullyBookedDates(User user);

        /// <summary>
        /// Uppdaterar TicketStatus för en lista med Tickets
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ceremonies">Ceremoniinformationen (<see cref="CeremonySummaryDetails"/>) som ska uppdateras.</param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof (StockholmStadApplicationErrorFault))]
        [FaultContract(typeof (StockholmStadSystemErrorFault))]
        void UpdateTicketsWithStatus(User user, List<CeremonySummaryDetails> ceremonies);

        /// <summary>
        /// Hämtar övrig information för ett ärende. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ticketId">Ärende-numret för den ceremoniinformation som ska hämtas</param>
        /// <returns>Informationen för ett visst ärende (<see cref="TicketInformation"/>). </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        TicketInformation GetTicketInformation(User user, int ticketId);

        /// <summary>
        /// Lägger till övrig information till ett ärende. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ticketInformation">Den information som ska läggas till (<see cref="TicketInformation"/>).</param>
        /// <returns>Id-värdet på den tillagda informationen. </returns>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        int AddTicketInformation(User user, TicketInformation ticketInformation);

        /// <summary>
        /// Uppdaterar övrig information för ett visst ärende. 
        /// </summary>
        /// <param name="user">Den inloggade användaren (<see cref="User"/>).</param>
        /// <param name="ticketInformation">Den information som ska uppdateras. </param>
        [OperationContract]
        [FaultContract(typeof(StockholmStadApplicationErrorFault))]
        [FaultContract(typeof(StockholmStadSystemErrorFault))]
        void UpdateTicketInformation(User user, TicketInformation ticketInformation);


    }
}
